home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fatted Calf
/
The Fatted Calf.iso
/
Applications
/
Games
/
NeXTmille
/
Source
/
DistanceCardStackView.m
< prev
next >
Wrap
Text File
|
1990-12-01
|
4KB
|
190 lines
/* Generated by Interface Builder */
#import "DistanceCardStackView.h"
#import "angled_title.h"
#import "CardView.h"
#import "StackView.h"
#import "mille.h"
#import "prototypes.h"
#import <assert.h>
#import <objc/List.h>
// This is the number of card stacks built into a distance
// pile view.
#define NUMBER_OF_CARD_STACK_VIEWS 5
// This is the number of pixels that the top and bottom frames
// of the stack view should be inset from the frame of the
// distance view's frame.
#define HEIGHT_INSET 5
// Here's a trick. The distance miles of the cards can be
// obtained by interrogating them (it is their tag value).
// I assign a tag value of the card's distance to the stack
// views. All of the cards in a distance stack has a tag
// value the same as the stack itself. This shouldn't confuse
// the searching mechanism to find the stack for a distance
// value.
static int tagAssociate[] = { C_200, C_100, C_75, C_50, C_25 };
@implementation DistanceCardStackView
// A distance view maintains 5 StackView objects. These views
// are tiled within the distance view. There is a stack for
// 25, 50, 75, 100, and 200 mile cards. These stacks are
// overlapping stacks. These stacks are subviews of this
// view.
+ newFrame:( const NXRect * )frameRect
{
int i;
float x_displacement = (( NX_WIDTH( frameRect ) - ( CARD_WIDTH * NUMBER_OF_CARD_STACK_VIEWS )) / NUMBER_OF_CARD_STACK_VIEWS );
self = [ super newFrame:frameRect ];
for( i = 0; i < NUMBER_OF_CARD_STACK_VIEWS; ++i ) {
NXRect stackFrame = { (( x_displacement / 2 ) + ( i * ( x_displacement + CARD_WIDTH ))),
HEIGHT_INSET,
CARD_WIDTH,
( NX_HEIGHT( frameRect ) - ( 2 * HEIGHT_INSET ))
};
char *subviewTitle = alloca( 64 );
sprintf( subviewTitle, "%d Miles", tagAssociate[ i ]);
[ self addSubview:[[[ StackView newFrame:&stackFrame ] setOverlap:YES ] setTag:tagAssociate[ i ]]];
}
cards = [ List new ];
return self;
}
- free
{
[ cards free ];
return [ super free ];
}
- addCard:( CardView * )aCard :sender
{
int i;
BOOL cardAddedToStack = NO;
for( i = 0; !cardAddedToStack && ( i < [ subviews count ] ); ++i ) {
StackView *aStack = [ subviews objectAt:i ];
if([ aStack tag ] == [ aCard tag ]) {
[ aStack addCard:aCard :self ];
cardAddedToStack = YES;
}
}
assert( cardAddedToStack );
return self;
}
- removeCard:( CardView * )aCard :sender
{
int i;
assert([ aCard isDescendantOf:self ]);
for( i = 0; i < [ subviews count ]; ++i ) {
StackView *aStack = [ subviews objectAt:i ];
if([ aCard isDescendantOf:aStack ])
[ aStack removeCard:aCard :self ];
}
return self;
}
- sendCard:( CardView * )aCard to:anObject
{
assert([ aCard isDescendantOf:self ]);
[ self removeCard:aCard :self ];
[ anObject addCard:aCard :self ];
return [ self update ];
}
- sendAllCardsTo:anObject
{
int i;
for( i = 0; i < [ subviews count ]; ++i )
[[ subviews objectAt:i ] sendAllCardsTo:anObject ];
return [ self update ];
}
- ( List * )holderList
{
int i;
[ cards empty ];
for( i = 0; i < [ subviews count ]; ++i ) {
List *holderList = [[ subviews objectAt:i ] holderList ];
int j;
for( j = 0; j < [ holderList count ]; ++j )
[ cards addObject:[ holderList objectAt:j ]];
}
return cards;
}
- ( int )numCardTypeInHolder:( int )aCardTag
{
List *cardList = [ self holderList ];
int i, cnt;
for( i = 0, cnt = 0; i < [ cardList count ]; ++i )
if([[ cardList objectAt:i ] tag ] == aCardTag )
++cnt;
return cnt;
}
- ( int )numSafetiesInHolder
{
List *cardList = [ self holderList ];
int i, cnt;
for( i = 0, cnt = 0; i < [ cardList count ]; ++i )
if( isSafety([ cardList objectAt:i ]))
++cnt;
return cnt;
}
@end